【新サービス】最大100万個の証明書を管理可能!Google Cloud Certificate Manager が発表されました
ウィスキー、シガー、パイプをこよなく愛する大栗です。
Google Cloud で大量の証明書やワイルドカード証明書を管理できる Certificate Manager がプレビューとして発表されたので試してみます。Certificate Manager は SaaS 規模の証明書でも管理可能です。
Introducing Certificate Manager to simplify SaaS scale TLS and certificate management
Google Cloud Certificate Manager は2022年1月31日現在において、プレビューのステータスです。このプロダクトまたは機能は、Google Cloud Platform の利用規約の一般提供前のサービス規約の対象となります。一般提供前のプロダクトと機能では、サポートが制限されることがあります。また、一般提供前のプロダクトや機能に変更が加えられると、他の一般提供前バージョンと互換性がない場合があります。詳細については、リリースステージの説明をご覧ください。
Google Cloud Certificate Manager
元々 Google Cloud ではロードバランサにセルフマネージド SSL 証明書と Google マネージド SSL 証明書を無料で設定する機能があります。しかし、今回発表された Certificate Manager では、大量の証明書を一つのロードバランサーに集約したり、ワイルドカード証明書を利用できます。
大量の証明書
以前からあったロードバランサのマネージド証明書では最大15個の制限がありましたが、Certificate Manager ではロードバランサごとに最大100万の証明書をサポートします(デフォルトでは 100 に制限されています)。このため、ユーザーごと、リソースごとにドメインを分けるような Saas/Paas などで証明書を利用する場合などでも一つのロードバランサで管理できます。
Manage certificates beyond the Cloud Load Balancing's limit of 15 certificates per load balancer. Certificate Manager supports up to a million certificates per load balancer.
ワイルドカード証明書
Certificate Manager では、ワイルドカード証明書を発行できます。そのため大量のサブドメインがある場合などに手間がかからず効率的に証明書を管理できます。
料金
プレビュー期間中、Certificate Manager は無料です。ただし、Google Cloud プロジェクトで構成されている他のリソースや機能に対して料金が発生する場合があります。
証明書は最初の 100個まで無料です。100 を超える証明書を使用する場合は証明書ごと、月ごとの料金で課金されます。一般提供に移行されてから価格設定が有効になります。
証明書数 | 料金 |
---|---|
0-100 | 無料 |
100-2K | $0.20/証明書/月 |
2K+ | $0.10/証明書/月 |
注意
- Certificate Manager は、従来のグローバル外部 HTTP(S) ロードバランサで利用可能です。ロードバランサは Network Service Tiers がプレミアム ティアにある必要があります。
- 管理できる証明書は公的に信頼されている CA の証明書です。つまり、公開されているドメインに対してのみ Google マネージド証明書を発行できます。
- Certificate Manager は Google マネージド証明書で Google CA とLet's Encrypt CA のみサポートしています。
- Google マネージド証明書のドメイン(Subject Alternative Names)の数は、DNS 認証の場合は最大 100 まで、ロードバランサ認証の場合は最大 5 までと制限されています(これらのクオータを増やすことはできません)。
- Google マネージド証明書に指定するプライマリドメインは、64文字より短い名前である必要があります。この制限を超えるドメインで Google マネージド証明書が必要な場合は複数ドメイン(SAN)を持つ証明書を作成し、プライマリドメインの後に長いドメイン名を指定します。プライマリドメイン以外のドメインの長さはロードバランサ認証を使用する場合は 253 文字、DNS 認証を使用する場合は 237 文字です。
やってみた
Google マネージド証明書を使用する前提で、Certificate Manager を試してみます。内容はチュートリアルに沿って進めていきます。
gcloud
コマンドを使用するため、事前に最新化しておきましょう。またグローバル外部 HTTP(S) ロードバランサは事前にlb-ccm-test
という名前で準備済みとします。
パブリック DNS ゾーンを作成する
Cloud Console で Cloud DNS を開き、CREATE ZONE
をクリックします。
Zone Type
でPublic
を選択します。Zone name
には任意の判別するための名称を入力して、DNS name
に管理するゾーンのドメイン名を入力します。DNSSEC
やCloud Logging
は任意に設定してください。ここではDNSSEC
をOff
にします。
SOA
レコードとNS
レコードが作成されました。NS
レコードのレコード名をクリックします。
登録されている DNS サーバを確認します。
別のプロジェクトや Google Cloud 以外でドメインを管理している場合には、DNS サーバを元に NS レコードを作成して対象ドメインの管理を Cloud DNS にします。
DNS 認証を作成する
gcloud beta certificate-manager dns-authorizations create
コマンドで DNS 認証を作成します。--domain
オプションで 証明書を作成するドメインを設定します。ここでは DNS 認証の名前にccm-test-domain
と設定しました。
$ gcloud beta certificate-manager dns-authorizations create ccm-test-domain \ > --domain="ccm.example.net" API [certificatemanager.googleapis.com] not enabled on project [123456789012]. Would you like to enable and retry (this will take a few minutes)? (y/N)? y Enabling service [certificatemanager.googleapis.com] on project [123456789012]... Operation "operations/abcd.a1-123456789012-abcdefgh-1234-abcd-1234-1a2b3c4d5e6f" finished successfully. Create request issued for: [ccm-test-domain] Waiting for operation [projects/project-id/locations/global/operations/operation-1234567890123-a1b2c3d4e5f6g-1a2b3c4d-a1b2c3d4] to complete...done. Created dnsAuthorization [ccm-test-domain]. NAME DOMAIN DNS_RECORD RECORD_TYPE DNS_VALUE ccm-test-domain ccm.example.net _acme-challenge.ccm.example.net. CNAME 1234abcd-5678-efgh-90ij-123456abcdef.99.authorize.certificatemanager.goog.
コマンドは DNS に登録する CNAME レコードを返します。
DNS に CNAME レコードを追加します。
対象のドメインについて DNS レコードのトランザクションを開始します。--zone
オプションで任意の DNS レコードセットの名称を設定します。
$ gcloud dns record-sets transaction start --zone="ccm-test-domain" Transaction started [transaction.yaml].
DNS 認証の CNAME レコードを追加します。作成した DNS 認証の内容を設定します。--name
オプションには DNS_RECORD の内容を設定します。CNAME も DNS_RECORD も最後の.
を含めて入力します。
$ gcloud dns record-sets transaction add 1234abcd-5678-efgh-90ij-123456abcdef.99.authorize.certificatemanager.goog. \ > --name="_acme-challenge.ccm.example.net." \ > --ttl="30" \ > --type="CNAME" \ > --zone="ccm-test-domain" Record addition appended to transaction at [transaction.yaml].
DNS レコードのトランザクションを実行して、変更を保存します。
$ gcloud dns record-sets transaction execute --zone="ccm-test-domain" Executed transaction [transaction.yaml] for managed-zone [ccm-test-domain]. Created [https://dns.googleapis.com/dns/v1/projects/project-id/managedZones/ccm-test-domain/changes/3]. ID START_TIME STATUS 3 2022-01-31T22:34:59.963Z pending
DNS 認証を参照する Google マネージド証明書を作成します
作成した DNS 認証を参照する Google マネージド証明書を新規に作成するために、次のコマンドを実行します。ここでは証明書の名前にcert-ccm
と設定しました。
$ gcloud beta certificate-manager certificates create cert-ccm \ > --domains=ccm.example.net --dns-authorizations=ccm-test-domain Create request issued for: [cert-ccm] Waiting for operation [projects/project-id/locations/global/operations/operation-1234567890123-a1b2c3d4e5f6g-1a2b3c4d-a1b2c3d4] to complete...done. Created certificate [cert-ccm].
証明書をロードバランサーにデプロイします
証明書マップを作成します。ここでは証明書マップの名前にcert-map
と設定しました。
$ gcloud beta certificate-manager maps create cert-map Waiting for 'operation-1234567890123-a1b2c3d4e5f6g-1a2b3c4d-a1b2c3d4' to complete...done. Created certificate map [cert-map].
証明書マップエントリを作成して、証明書と証明書マップに関連付けます。ここでは証明書マップエントリの名前にcert-map-entry-1
と設定しました。
$ gcloud beta certificate-manager maps entries create cert-map-entry-1 \ > --map="cert-map" \ > --certificates="cert-ccm" \ > --hostname="ccm.example.net" Waiting for 'operation-1234567890123-a1b2c3d4e5f6g-1a2b3c4d-a1b2c3d4' to complete...done. Created certificate map entry [cert-map-entry-1].
証明書マップエントリがアクティブであることを確認します
証明書マップエントリの内容を表示してstate
がACTIVE
になっていることを確認します。
$ gcloud beta certificate-manager maps entries describe cert-map-entry-1 \ > --map="cert-map" certificates: - projects/123456789012/locations/global/certificates/cert-ccm createTime: '2022-01-31T23:57:37.965726317Z' hostname: ccm.example.net name: projects/project-id/locations/global/certificateMaps/cert-map/certificateMapEntries/cert-map-entry-1 state: ACTIVE updateTime: '2022-01-31T23:57:38.357486815Z'
証明書の内容を表示してstate
がACTIVE
になっていることを確認します。
$ gcloud beta certificate-manager certificates describe cert-ccm createTime: '2022-01-31T22:45:52.947151263Z' expireTime: '2022-05-01T21:45:54Z' managed: authorizationAttemptInfo: - domain: ccm.example.net state: AUTHORIZED dnsAuthorizations: - projects/123456789012/locations/global/dnsAuthorizations/ccm-test-domain domains: - ccm.example.net state: ACTIVE name: projects/project-id/locations/global/certificates/cert-ccm : | -----BEGIN CERTIFICATE----- ・ ・ ・ -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- ・ ・ ・ -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- ・ ・ ・ -----END CERTIFICATE----- sanDnsnames: - ccm.example.net updateTime: '2022-01-31T22:45:53.517894284Z'
ロードバランサに HTTPS プロキシを作成しつつ証明書マップをアタッチします。ここでは HTTPS プロキシの名前にlb-ccm-test-https-target-proxy
と設定しました。
$ gcloud beta compute target-https-proxies create lb-ccm-test-https-target-proxy \ > --url-map=lb-ccm-test \ > --certificate-map="cert-map" Created [https://www.googleapis.com/compute/beta/projects/project-id/global/targetHttpsProxies/lb-ccm-test-https-target-proxy]. NAME SSL_CERTIFICATES URL_MAP CERTIFICATE_MAP lb-ccm-test-https-target-proxy lb-ccm-test cert-map
HTTPS 用の受信リクエストをプロキシに転送するグローバル転送ルールを作成します。必要に応じて--address
オプションで IP アドレスを指定するなどしてください。ここでは転送ルールの名前にlb-ccm-test-https-forwarding-rule
と設定しました。
$ gcloud beta compute forwarding-rules create lb-ccm-test-https-forwarding-rule \ > --load-balancing-scheme=EXTERNAL \ > --network-tier=PREMIUM \ > --global \ > --target-https-proxy=lb-ccm-test-https-target-proxy \ > --ports=443 Created [https://www.googleapis.com/compute/beta/projects/project-id/global/forwardingRules/lb-ccm-test-https-forwarding-rule].
グローバル転送ルールを確認して、付与されている IP アドレスを確認します。
$ gcloud beta compute forwarding-rules describe lb-ccm-test-https-forwarding-rule --global IPAddress: 203.0.113.253 IPProtocol: TCP creationTimestamp: '2022-01-31T16:49:55.288-08:00' description: '' fingerprint: ab1234ABCD1= id: '1234567890123456789' ipVersion: IPV4 kind: compute#forwardingRule labelFingerprint: 12AcCd34567= loadBalancingScheme: EXTERNAL name: lb-ccm-test-https-forwarding-rule networkTier: PREMIUM portRange: 443-443 selfLink: https://www.googleapis.com/compute/beta/projects/project-id/global/forwardingRules/lb-ccm-test-https-fo rwarding-rule target: https://www.googleapis.com/compute/beta/projects/project-id/global/targetHttpsProxies/lb-ccm-test-https-t arget-proxy
最後に、確認した IP アドレスを管理対象ドメインの A レコードとして登録します。
アクセスする
ロードバランサのバックエンドに、以下の様な PHP スクリプトを用意しておきました。
<?php phpinfo(INFO_VARIABLES);
ブラウザからアクセスしてみます。このように問題なく表示され、https でアクセスできています。
証明書も確認してみましょう。発行者名を確認すると、Google Trust Services で発行された証明書であることが分かります。また証明書の期限は3ヶ月になっています。
さいごに
今まではロードバランサ辺り証明書が 15 個までという制限があり、多数のドメインをホストするユースケースではロードバランサを多数用意する必要がありました。Certificate Manager によって、多数のマルチドメインやワイルドカードの証明書が発行せきるため、リソースを集約することが可能になります。
特に最大100万個の証明書までホストできるため、特に SaaS や PaaS の提供者にとって重要なアップデートになっていると思われます。まだ一般提供前ですが、早く一般提供になってほしいサービスです。